home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 726-750 / 727 / 2view / source / arexx.c < prev    next >
C/C++ Source or Header  |  1995-03-18  |  7KB  |  275 lines

  1.  
  2. /*ARexx.c:  This is the ARexx support code module*/
  3.  
  4.  
  5. #include <exec/types.h>
  6. #include <intuition/intuition.h>
  7. #include <clib/intuition_protos.h>
  8. #include "minrexx.h"
  9. #include "arexx.h"
  10.  
  11. #include <pragmas/exec_pragmas.h>
  12. #include <pragmas/intuition_pragmas.h>
  13.  
  14. enum ButtonTypes {none=0,select,menu};
  15. typedef enum ButtonTypes ButtonTypes;
  16.  
  17. extern struct Library *SysBase;
  18. extern struct Library *IntuitionBase;
  19. extern BYTE specialModes;
  20.  
  21. struct RexxMsg *rexxMsg;
  22.  
  23. /*These variables are defined in 2View.c, and are used to enable the ARexx*/
  24. /*routines to communicate with the rest of the program*/
  25.  
  26. /*This variable is used to tell 2View to quit or advance*/
  27. extern ButtonTypes rexxAbort;
  28.  
  29. extern struct Screen *prevScreen;   /*The current screen*/
  30.  
  31. extern char *picFilename;  /*The filename of the current picture*/
  32. extern char *playListFilename;     /*The name of the playlist*/
  33.  
  34. extern UWORD ticks;  /*The number of ticks remaining to show each picture*/
  35. extern UWORD ticksRemaining;   /*The time left to show the current picture*/
  36.  
  37. extern BOOL loop;       /*TRUE if the user specified 'loop'*/
  38. extern BOOL printPics;       /*TRUE if we're printing each picture*/
  39.  
  40. extern BOOL cycle;       /*TRUE if colors are cycling*/
  41. extern UBYTE rate,numCycleColors;
  42.  
  43. extern char *version;       /*2View's version string*/
  44.  
  45. void rQuit(char *p);
  46. void rAdvance(char *p);
  47. void rGet(char *p);
  48. void rPicToFront(char *p);
  49. void rPicToBack(char *p);
  50. void rPrint(char *p);
  51. void rCycle(char *p);
  52.  
  53. struct rexxCommandList commandList[] =
  54. {
  55.    { "quit" , (APTR)&rQuit },     /*Abort a picture sequence*/
  56.    { "advance", (APTR)&rAdvance },  /*Show the next picture in the sequence*/
  57.    { "get", (APTR)&rGet },          /*Multi-purpose*/
  58.    { "pictofront", (APTR)&rPicToFront }, /*Bring the picture to the front*/
  59.    { "pictoback", (APTR)&rPicToBack },   /*Send the picture to the back*/
  60.    { "print", (APTR)&rPrint },           /*Print the picture*/
  61.    { "cycle", (APTR)&rCycle },           /*Turn color cycling on/off*/
  62.    { NULL, NULL }
  63. };
  64.  
  65. char portName[16];
  66. char arexxBuf[140];
  67.  
  68.  
  69. /*Open the ARexx port*/
  70. long initRexxPort(void)
  71. {
  72.    determinePortName(portName);  /*Get the port name*/
  73.  
  74.    /*Ask minrexx to open the port and return the port's signal bit*/
  75.    return(upRexxPort(portName,commandList,"rx",(APTR)&disp));
  76. }
  77.  
  78. char *result="RESULT";
  79. UBYTE errorNum=0;
  80.  
  81. /*Determine what the ARexx port name should be.  The first running instance*/
  82. /*of 2View should have an ARexx port named '2View.1'.  The second, '2View.2'*/
  83. /*etc.    This starts at '2View.1' and works up until it finds a free space*/
  84. /*(up to 2View.99)*/
  85. void determinePortName(char *portName)
  86. {
  87.    ULONG c=1;
  88.    UBYTE len;
  89.  
  90.    strcpy(portName,"2View.");
  91.  
  92.    do
  93.    {
  94.       len=stcu_d(&portName[6],c++);
  95.       portName[6+len]=NULL;
  96.    }
  97.    while(FindPort(portName)!=NULL && c<100);
  98.    if(FindPort(portName)!=NULL)
  99.       exit(50);
  100.    return;
  101. }
  102.  
  103. /*The ARexx command dispatch function.    This calls the functions associated*/
  104. /*with a particular command*/
  105. int disp(struct RexxMsg *msg,struct rexxCommandList *dat,char *p)
  106. {
  107.    rexxMsg=msg;
  108.  
  109.    /*Call the function that supports the command*/
  110.    ((int (*)())(dat->userdata))(p);
  111.  
  112.    /*Reply to ARexx, using the reply string and error number set by the*/
  113.    /*function just called*/
  114.    replyRexxCmd(rexxMsg,errorNum,0,arexxBuf);
  115.    errorNum=0;
  116.    return(1);  /*1 means that minrexx shouldn't reply to the rexx message*/
  117. }
  118.  
  119. /*quit:  Abort a sequence of pictures*/
  120. void rQuit(char *p)
  121. {
  122.    rexxAbort=menu;    /*It's like the user pressed the right mouse button*/
  123.    strcpy(arexxBuf,result);
  124. }
  125.  
  126. /*advance:  Advance to the next picture in this sequence*/
  127. void rAdvance(char *p)
  128. {
  129.    rexxAbort=select;    /*Like pressing the left mouse button*/
  130.    strcpy(arexxBuf,result);
  131. }
  132.  
  133. /*get:    This function gets information about the current picture/playlist*/
  134. void rGet(char *p)
  135. {
  136.    p++;
  137.  
  138.    /*The picture's filename*/
  139.    if(stricmp(p,"name")==0)
  140.       strcpy(arexxBuf,picFilename);
  141.  
  142.    /*The picture width*/
  143.    else if(stricmp(p,"width")==0)
  144.       stcu_d(arexxBuf,prevScreen->Width);
  145.  
  146.    /*The height*/
  147.    else if(stricmp(p,"height")==0)
  148.       stcu_d(arexxBuf,prevScreen->Height);
  149.  
  150.    /*The number of bitplanes*/
  151.    else if(stricmp(p,"depth")==0)
  152.       stcu_d(arexxBuf,prevScreen->BitMap.Depth);
  153.  
  154.    /*The viewmodes of the picture (HAM, HIRES, LACE, etc.*/
  155.    else if(stricmp(p,"viewmodes")==0)
  156.       stci_h(arexxBuf,prevScreen->ViewPort.Modes);
  157.  
  158.    else if(stricmp(p,"specialmodes")==0)
  159.       switch(specialModes)
  160.       {
  161.      case NORMAL:
  162.         strcpy(arexxBuf,"NONE");
  163.         break;
  164.      case SHAM:
  165.         strcpy(arexxBuf,"SHAM");
  166.         break;
  167.      case MACROPAINT:
  168.         strcpy(arexxBuf,"MACROPAINT");
  169.         break;
  170.       }
  171.  
  172.    /*The time left to display this picture*/
  173.    else if(stricmp(p,"timeleft")==0)
  174.       stcu_d(arexxBuf,ticksRemaining);
  175.  
  176.    /*The time to display each picture*/
  177.    else if(stricmp(p,"timeperpicture")==0)
  178.       stcu_d(arexxBuf,ticks);
  179.  
  180.    /*The version number and date of this program*/
  181.    else if(stricmp(p,"version")==0)
  182.       strcpy(arexxBuf,&version[12]);
  183.  
  184.    /*The name of the playlist, or '?NONE?' if there is no playlist*/
  185.    else if(stricmp(p,"playlistname")==0)
  186.       if(playListFilename==NULL)
  187.      strcpy(arexxBuf,"?NONE?");
  188.       else
  189.      strcpy(arexxBuf,playListFilename);
  190.  
  191.    /*Returns 'TRUE' if the user specified 'loop' on the command line, 'FALSE'*/
  192.    /*if he didn't*/
  193.    else if(stricmp(p,"looping")==0)
  194.       if(loop)
  195.      strcpy(arexxBuf,"TRUE");
  196.       else
  197.      strcpy(arexxBuf,"FALSE");
  198.  
  199.    /*Returns 'TRUE' if the user specified 'print' on the command line,*/
  200.    /*FALSE if she didn't*/
  201.    else if(stricmp(p,"printpictures")==0)
  202.       if(printPics)
  203.      strcpy(arexxBuf,"TRUE");
  204.       else
  205.      strcpy(arexxBuf,"FALSE");
  206.  
  207.    else if(stricmp(p,"cyclerate")==0)
  208.       if(numCycleColors!=0)
  209.      stcu_d(arexxBuf,rate);
  210.       else
  211.      strcpy(arexxBuf,"-VOID-");
  212.  
  213.    else if(stricmp(p,"cyclestatus")==0)
  214.       if(cycle)
  215.      strcpy(arexxBuf,"CYCLING");
  216.       else
  217.      if(numCycleColors!=0)
  218.         strcpy(arexxBuf,"CYCLINGPAUSED");
  219.      else
  220.         strcpy(arexxBuf,"NOCYCLING");
  221.  
  222.    /*Otherwise, we don't understand, so return an error*/
  223.    else
  224.    {
  225.       errorNum=100;
  226.       strcpy(arexxBuf,"ERROR");
  227.    }
  228. }
  229.  
  230. /*pictofront:  Send the picture's screen to the front*/
  231. void rPicToFront(char *p)
  232. {
  233.    ScreenToFront(prevScreen);
  234.    strcpy(arexxBuf,result);
  235. }
  236.  
  237. /*pictoback:  Send the picture's screen to the back*/
  238. void rPicToBack(char *p)
  239. {
  240.    ScreenToBack(prevScreen);
  241.    strcpy(arexxBuf,result);
  242. }
  243.  
  244. /*print:  Print the currently displayed picture*/
  245. void rPrint(char *p)
  246. {
  247.    dumpRastPort(&(prevScreen->RastPort),&(prevScreen->ViewPort));
  248.    strcpy(arexxBuf,result);
  249. }
  250.  
  251. /*cycle:  Turn color cycling on and off*/
  252. void rCycle(char *p)
  253. {
  254.    p++;
  255.  
  256.    if(stricmp(p,"on")==0)
  257.    {
  258.       if(!cycle)
  259.      toggleCycling();
  260.    }
  261.    else if(stricmp(p,"off")==0)
  262.    {
  263.       if(cycle)
  264.      toggleCycling();
  265.    }
  266.    else if(stricmp(p,"toggle")==0)
  267.       toggleCycling();
  268.  
  269.    strcpy(arexxBuf,result);
  270.    return;
  271. }
  272.  
  273. /*End of ARexx.c*/
  274.  
  275.